Как Вы уже знаете MFC уже имеет много классов видов. Естественно, что все Ваши потребности готовые классы удовлетворить не могут, поэтому мы с Вами попробуем изменить стандартный класс вида на свой манер. Давайте создадим приложение MFC AppWizard с именем TestViews. Пусть оно будет SDI и все дальше можете жать Finish.
Теперь нам надо создать класс порожденный от CView. Для этого выбираем Insert -> New Class, даем ему имя MyView, а базовым классом делаем CView. Нажимаем OK в результате у нас появляется новый класс. В проекте у нас уже есть класс вида CTestViewsView, который наследуется от CView, давайте унаследуем его от MyView, для начала в файле заголовка указываем на него ссылку.
....... #endif // _MSC_VER > 1000 #include "MyView.h" class CTestViewsView : public CView .......
Теперь меняем папу.
......
class CTestViewsView : public MyView
{
......
Вот теперь в нашем классе MyView можно перегрузить виртуальную функцию Create.
BOOL MyView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName,
DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID,
CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
return CWnd::Create(lpszClassName, lpszWindowName, dwStyle,
rect, pParentWnd, nID, pContext);
}
А вот CWnd::Create можно заменить. Для этого посмотрим в исходных кодах MFC как это реализовано. Вот так.
BOOL CWnd::Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd, UINT nID,
CCreateContext* pContext)
{
// can't use for desktop or pop-up windows (use CreateEx instead)
ASSERT(pParentWnd != NULL);
ASSERT((dwStyle & WS_POPUP) == 0);
return CreateEx(0, lpszClassName, lpszWindowName,
dwStyle | WS_CHILD,
rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
pParentWnd->GetSafeHwnd(), (HMENU)nID, (LPVOID)pContext);
}
Но так можем и мы :-)
BOOL MyView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName,
DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
UINT nID, CCreateContext* pContext)
{
return CreateEx(0, lpszClassName, lpszWindowName,
dwStyle | WS_CHILD | WS_DLGFRAME ,
rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
pParentWnd->GetSafeHwnd(), (HMENU)nID, (LPVOID)pContext);
}
Я специально добавил стиль WS_DLGFRAME, чтобы показать возможность изменения. Посмотрите на результат этого изменения ниже и Вы увидите разницу в виде вида :-)
